package com.brain.cont.view.mbean;

import com.brain.cont.dto.PlanContableDetaDto;
import com.brain.cont.dto.PlanContableDto;
import com.brain.cont.manager.PlanContableDetaManager;
import com.brain.cont.manager.PlanContableManager;
import com.brain.cont.view.util.ConstantesCont;
import com.brain.segu.mbean.*;
import com.brain.core.dto.EmpresaDto;
import com.brain.core.exception.DAOException;
import com.brain.core.manager.BitacoraManager;
import com.brain.core.manager.EmpresaManager;
import com.brain.core.manager.RecursosManager;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.GenericMBean;
import com.brain.core.view.mbean.SessionMBean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.primefaces.model.TreeNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 * @author Greip Company
 * @since 28/01/2014
 * @version 1.0
 */
@Controller("planContableMBean")
@Scope("session")
public class PlanContableMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(OpcionSistemaMBean.class);
    @Resource
    private PlanContableManager manager;
    @Resource
    private EmpresaManager empresaManager;
    @Resource
    private PlanContableDetaManager planContableDetaManager;
    @Resource
    private BitacoraManager bitacoraManager;
    @Resource
    private RecursosManager recursosManager;
    private List<PlanContableDto> lista;
    private PlanContableDto dto;
    private PlanContableDto dtoFiltro;
    
    private PlanContableDetaDto detaDto;
    private String keyEntidad = "key.entidad.opciones.sistema";
    private String keyTitulo = "key.entidad.plan.contable";
    
    private TreeNode tNplanContableDeta;
    private TreeNode selectedObjetoPlanContable;
    private PlanContableDetaDto planContableSeleccionado;
    private Boolean validarBotonGuardar = Boolean.FALSE;
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;
    public PlanContableMBean() {
    }

    public String iniciar() {
        
            this.lista = null;
            this.dto = null;
            this.dtoFiltro = new PlanContableDto();
            
          //  this.tNplanContableDeta = this.cargarPlanContable(this.planContableDetaManager.obtenerPorId(17333L));
        
        return manager.getUrlLista();
    }

    public String cargaOpcionsistemaDesdeEmpresa(EmpresaDto empresaDto) {
        return manager.getUrlLista();
    }
    
    public void buscar() {
        try {
            lista = manager.buscar(dtoFiltro);
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }
    
    public String nuevo() {
        sessionMBean.setAccion(ConstantesCont.Formulario.NUEVO);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        
        this.dto = new PlanContableDto();     
        
        return manager.getUrlPrincipal();
    }
    
    public String ver() {
        sessionMBean.setAccion(ConstantesCont.Formulario.VER);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        return manager.getUrlPrincipal();
    }
    
    public String editar() {
        sessionMBean.setAccion(ConstantesCont.Formulario.EDITAR);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        return manager.getUrlPrincipal();
    }

    
    public List<PlanContableDetaDto> autoCompletarCuentaContable(String query) {
        List<PlanContableDetaDto> results = null;
        try {
            results = planContableDetaManager.autoCompletarCuenta(query);
        } catch (DAOException ex) {
            logger.error(ex);
            results = new ArrayList<PlanContableDetaDto>();
        }
        return results;
    }

    /**
     * Metodo que permite crear un TreeNode con los datos de las opciones del
     * sistema de la empresa
     *
     * @since 28/01/2014
     * @param empresaDto
     * @return retorna una TreeNode con los datos de todas las opciones del
     * sistema
     */
   /* private TreeNode cargarPlanContable(PlanContableDetaDto i) {
        return this.planContableDetaManager.planContableCarga(i);
    }*/

    /**
     * Metodo que permite cargar los valores de un dto existente y construye el
     * formulario para editar un registro
     *
     * @since 28/01/2014
     * @return retorna la url de la pagina de editado
     */
    public void editarPlanContableDeta() {
        this.detaDto = new PlanContableDetaDto();
        this.planContableSeleccionado = (PlanContableDetaDto) selectedObjetoPlanContable.getData();
        this.detaDto = this.planContableSeleccionado;
        sessionMBean.setAccion(applicationMBean.getEditar());
    }

    /**
     * Metodo que setea los valores del dto y construye el formulario para crear
     * un nuevo registro
     *
     * @since 28/01/2014
     * @return retorna la url de la nueva pagina
     */
    public void nuevoPlanContableDeta() {
        this.planContableSeleccionado = (PlanContableDetaDto) selectedObjetoPlanContable.getData();
        System.out.println(planContableSeleccionado);
        this.detaDto = new PlanContableDetaDto();
        this.detaDto.setPlanContableDto(planContableSeleccionado.getPlanContableDto());
        this.detaDto.setCuentaPadreDto(planContableSeleccionado);
        this.detaDto.setEstado(Boolean.TRUE);
        sessionMBean.setAccion(applicationMBean.getNuevo());
    }

    public void guardarPlanContableDeta() throws DAOException {
        //this.dto.setEmpresa(this.empresaId.getId());
        if (planContableDetaManager.guardar(this.detaDto) !=null){
            this.iniciar();
        }
    }
    
    public String retroceder() {
        sessionMBean.setAccion(ConstantesCont.Formulario.LISTA);
        sessionMBean().setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean().getAccion()));
        return manager.getUrlLista();
    }

    
    /**
     * Metodo que permite registra y editar los valores de la entidad actual
     *
     * @since 28/01/2014
     */
     public void guardar() {
        try {
            if (manager.guardar(dto) != null) {
                this.dto = this.manager.obtenerPorId(this.dto.getId());
                sessionMBean.setAccion(ConstantesCont.Formulario.EDITAR);
            }
        } catch (DAOException ex) {
            recursosManager.showError(ex.getMessage());
        }
    }

    /**
     * Metodo que permite ver el historial de las acciones de un usuario sobre
     * el registro seleccionado
     *
     * @since 28/01/2014
     * @return retorna un valor nulo
     */
    public String verBitacora() {
        PlanContableDto ubgDtoAux = new PlanContableDto();
        ubgDtoAux = (PlanContableDto) selectedObjetoPlanContable.getData();
        bitacoraManager.cargarBitacoraEntidad(manager.getIdEntidad(), ubgDtoAux.getId());
        return null;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        PlanContableMBean.logger = logger;
    }

    public PlanContableManager getManager() {
        return manager;
    }

    public void setManager(PlanContableManager manager) {
        this.manager = manager;
    }

    public EmpresaManager getEmpresaManager() {
        return empresaManager;
    }

    public void setEmpresaManager(EmpresaManager empresaManager) {
        this.empresaManager = empresaManager;
    }
 
    public List<PlanContableDto> getLista() {
        return lista;
    }

    public void setLista(List<PlanContableDto> lista) {
        this.lista = lista;
    }

    public PlanContableDto getDto() {
        return dto;
    }

    public void setDto(PlanContableDto dto) {
        this.dto = dto;
    }

    public TreeNode getSelectedObjetoPlanContable() {
        return selectedObjetoPlanContable;
    }

    public void setSelectedObjetoPlanContable(TreeNode selectedObjetoPlanContable) {
        this.selectedObjetoPlanContable = selectedObjetoPlanContable;
    }

    public PlanContableDetaDto getPlanContableSeleccionado() {
        return planContableSeleccionado;
    }

    public void setPlanContableSeleccionado(PlanContableDetaDto planContableSeleccionado) {
        this.planContableSeleccionado = planContableSeleccionado;
    }
 

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }
 
    public String getKeyEntidad() {
        return keyEntidad;
    }

    public void setKeyEntidad(String keyEntidad) {
        this.keyEntidad = keyEntidad;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }
 
    public Boolean getValidarBotonGuardar() {
        return validarBotonGuardar;
    }

    public void setValidarBotonGuardar(Boolean validarBotonGuardar) {
        this.validarBotonGuardar = validarBotonGuardar;
    }

    public PlanContableDetaManager getPlanContableDetaManager() {
        return planContableDetaManager;
    }

    public void setPlanContableDetaManager(PlanContableDetaManager planContableDetaManager) {
        this.planContableDetaManager = planContableDetaManager;
    }

    public BitacoraManager getBitacoraManager() {
        return bitacoraManager;
    }

    public void setBitacoraManager(BitacoraManager bitacoraManager) {
        this.bitacoraManager = bitacoraManager;
    }

    public TreeNode gettNplanContableDeta() {
        return tNplanContableDeta;
    }

    public void settNplanContableDeta(TreeNode tNplanContableDeta) {
        this.tNplanContableDeta = tNplanContableDeta;
    }

    public PlanContableDetaDto getDetaDto() {
        return detaDto;
    }

    public void setDetaDto(PlanContableDetaDto detaDto) {
        this.detaDto = detaDto;
    }

    public PlanContableDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(PlanContableDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }
    
    
 
}
